小ネタ:runnのカスタムランナーでFizzBuzzやってみた
これは革命が来たのでは? #runn開発者会議https://t.co/5ViOA46e0z
— k1LoW (@k1LoW) February 20, 2024
ふむふむ。
Support Custom runner (using Include runner) by k1LoW · Pull Request #805 · k1LoW/runn
This change allows defining a runner with different syntax while using existing runners.
もともとあるrunnerを使ったカスタム構文を作れる、と。
やってみた
こういうときのお遊びといったら、FizzBuzzと相場が決まっています(髙野調べ)。
まず、カスタムrunnerを定義して呼び出すrunbookを作ります。
desc: Custom runners runners: fizzbuzz: path: fizz-buzz.yaml steps: - loop: 20 fizzbuzz: num: "{{ i+1 }}"
20回ループしながら、1→20までの数字を fizzbuzz
という名前で定義したカスタムランナーに、num
という名前で渡します。
ポイントはこちら。
- カスタムランナーは
runners
セクションのキーとして設定する - カスタムランナーの定義は別ファイル(今回は
fizz-buzz.yaml
)に切り出してインクルードする
次にカスタムランナーの定義であるfizz-buzz.yaml
を作ります。
desc: FizzBuzz runner vars: num: '{{ parent.nodes.num }}' if: included steps: - if: 'vars.num % 3 == 0 && vars.num % 5 != 0' dump: "'fizz'" - if: 'vars.num % 3 != 0 && vars.num % 5 == 0' dump: "'buzz'" - if: 'vars.num % 3 == 0 && vars.num % 5 == 0' dump: "'fizz-buzz'" - if: 'vars.num % 3 != 0 && vars.num % 5 != 0' dump: vars.num
ポイントはこちら
- 引数は
vars
セクションにて、parent.nodes
のmapから、親ファイル(この場合custom-practice.yaml
)のカスタムランナー実行時に指定した値を引っ張り出す - ステップを途中で止めて早期リターンするような機能はないので、愚直に全部に
if
で条件を指定する
実行結果がこちら。
$ runn run custom-practice.yaml 1 2 fizz 4 buzz fizz 7 8 fizz buzz 11 fizz 13 14 fizz-buzz 16 17 fizz 19 buzz . 1 scenario, 0 skipped, 0 failures
ちゃんとFizzBuzzができていますね。
まとめ
今回はおふざけのようなカスタムランナーでしたが、記事の最初に紹介したPull Requestに含まれるファイルを見ると、結構柔軟に定義できるようです。 もうちょっとまともなものを作ったら、改めてご紹介しますね。